package com.wlxt.springcloud.member.controller;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.wlxt.springcloud.member.client.BookResultDTO;
import com.wlxt.springcloud.member.client.BookServiceClient;
import com.wlxt.springcloud.member.entity.Member;
import com.wlxt.springcloud.member.exception.BookNotFoundException;
import com.wlxt.springcloud.member.pojo.ResultDTO;
import com.wlxt.springcloud.member.service.MemberService;


@RestController
//@CrossOrigin  //跨域问题
@DefaultProperties(defaultFallback="defaultFallBack") //控制类默认降级方法
public class MemberController {

	@Autowired
	private MemberService memberService;
	//负载均衡客户端，是Ribbon的核心组件
//	@Autowired
//	private LoadBalancerClient loadBalancerClient;
	@Autowired
	private RestTemplate restTemplate;
	//注入Book-Service微服务客户端接口
	
	
	@GetMapping("/check")
	public ResultDTO checkMobile(String mobile) {
		ResultDTO result = new ResultDTO();
		try {
			result.setCode("0");
			result.setMessage("success");
			Member member = memberService.checkByMobile(mobile);
			result.setData(member);
		} catch (Exception e) {
			e.printStackTrace();
			result.setCode(e.getClass().getSimpleName());
			result.setMessage(e.getMessage());
		}
		return result;
	}
	
	@GetMapping("/test")
	//@HystrixCommand(fallbackMethod="fallback")   //服务降级的调用方法
	@HystrixCommand  
	//fallbackMethod="fallback"
		//如果不写，则使用默认的全局降级方法（在类上使用@DefaultProperties(defaultFallback="defaultFallBack")）的指定降级方法"defaultFallBack"
		//如果写上，则使用特定的降级方法"fallback"
	public String test(String bid) {
		//1、最简单的情况是使用SpringCloud内置的RestTemplate对象（不推荐）
		//RestTemplate 底层进行的Http传输是使用Apache HttpClient组件
//		RestTemplate restTemplate = new RestTemplate();
//		String json = restTemplate.getForObject("http://localhost:7102/info?bid=" + bid, String.class);
		//2、采用Ribbon进行客户端负载均衡（讲解原理，但并不使用）
//		RestTemplate restTemplate = new RestTemplate();
//		//获取服务列表，提供负载均衡  book-service 是微服务的serviceid
//		ServiceInstance serviceInstance = loadBalancerClient.choose("book-service");
//		//主机名
//		String host = serviceInstance.getHost();
//		//端口号
//		Integer port = serviceInstance.getPort();
//		String httpurl = "http://" + host + ":" + port + "/info?bid=" + bid;
//		System.out.println(httpurl);
//		String json = restTemplate.getForObject(httpurl, String.class);
		//3、利用注解简化URL通信
		//利用注解开发的时候，URL的主机名端口号都要换成对方微服务的serviceid
		String json = restTemplate.getForObject("http://book-service/info?bid=" + bid, String.class);
		System.out.println(json);
		return json;
	}
	
	//服务降级的方法，要求返回值，参数与目标方法保持一致
	private String fallback(String bid) {
		return "当前系统正忙，请稍后再试";
	}
	
	
	//全局默认的降级方法，不需要参数，且返回String 或者任何可以被JSON序列化的对象
	//默认情况下，Hystrix默认的timeout时间为1s
	private String defaultFallBack() {
		return "【默认系统降级】当前系统正忙，请稍后再试";
	}
	
	
	
	
	
	@GetMapping("/test1")
	public ResultDTO test1(String bid) {
		
		
		ResultDTO result = new ResultDTO();
		try {
			result.setCode("0");
			result.setMessage("success");
			String str = memberService.getInfo(bid);
			result.setData(str);
		} catch (Exception e) {
			e.printStackTrace();
			result.setCode(e.getClass().getSimpleName());
			result.setMessage(e.getMessage());
		}
		return result;
	}
	
	
}
